import { Page } from '@playwright/test';
import { sendLogToRenderer } from '../logUtils/sendLogToRenderer';
/**
 * 通用重试方法，用于执行指定的异步操作
 * @param page - Playwright 的 Page 对象，代表浏览器中的一个页面，用于执行页面操作
 * @param action - 要执行的异步操作
 * @param maxRetries - 最大重试次数，默认为 3 次
 * @param retryDelay - 每次重试之间的延迟时间（毫秒），默认为 2000 毫秒
 * @returns 异步操作的结果
 */
export async function withRetry<T>(page: Page, context: any, action: () => Promise<T>, actionName?: string, maxRetries = 3, retryDelay = 2000): Promise<T> {
  let retries = 0;
  const defaultActionName = actionName || '未命名操作';
  page.setDefaultTimeout(5000);
  while (retries < maxRetries) {
    try {
      sendLogToRenderer(`第 ${retries + 1} 次尝试执行操作: ${defaultActionName}`, 'info');
      return await action();
    } catch (error: any) {
      retries++;
      if (retries === 1) {
        sendLogToRenderer(`${defaultActionName} 第 1 次尝试失败，即将刷新页面后重试...`, 'info');
        await page.reload(); 
      }
      if (retries === maxRetries) {
        throw new Error(`${defaultActionName}失败，已达到最大重试次数: ${error.message}`);
      }
      sendLogToRenderer(`${defaultActionName}第 ${retries} 次尝试失败，${retryDelay} 毫秒后进行第 ${retries + 1} 次重试...`, 'info');
      await new Promise((resolve) => setTimeout(resolve, retryDelay));
    }
  }
  throw new Error(`未预期的重试逻辑结束，${defaultActionName} 失败`);
}
